package persistentie;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import domein.Consumptie;
import domein.Extra;
import domein.Resource;

public final class ArtikelMapper {

	public ArtikelMapper(){
	}
		
	public List<Resource> getResources() {
			
			List<Resource> resources = new ArrayList<Resource>();
			Connection cxn = Database.getInstance().getConnection();
			
			try{
				Statement statement = cxn.createStatement();
				ResultSet resultaat = statement.executeQuery("SELECT Resource.ArtikelID, Artikel.Omschrijving, Resource.Coordinaten, Resource.Status FROM Resource INNER JOIN Artikel ON Resource.ArtikelID = Artikel.ArtikelID");
				
				while (resultaat.next()){
					int artikelId = resultaat.getInt("ArtikelID");
					String omschrijving = resultaat.getString("Omschrijving");
					String coordinaten = resultaat.getString("Coordinaten");
					int status = resultaat.getInt("Status");
					Resource resource = new Resource(artikelId, omschrijving, coordinaten, status);
					resources.add(resource);
				}
				statement.close();			
			}
			catch(Exception e){
	
			}
		return resources;
		}
	
	public List<Consumptie> getConsumpties() {
		
		List<Consumptie> consumptieLijst = new ArrayList<Consumptie>();
		Connection cxn = Database.getInstance().getConnection();
		
		try{
			Statement statement = cxn.createStatement();
			ResultSet resultaat = statement.executeQuery("SELECT Consumptie.ArtikelID, Artikel.Omschrijving, Artikel.Eenheid, Artikel.Prijs FROM Artikel INNER JOIN Consumptie ON Consumptie.ArtikelID = Artikel.ArtikelID");
				
			while (resultaat.next()){
				int artikelId = resultaat.getInt("ArtikelID");
				String omschrijving = resultaat.getString("Omschrijving");
				String eenheid = resultaat.getString("Eenheid");
				double prijs = resultaat.getDouble("Prijs");	
										
				Consumptie consumptie = new Consumptie(artikelId, omschrijving, eenheid, prijs);
				consumptieLijst.add(consumptie);
			}
			statement.close();
					
		}
		catch(Exception e){
	
		}
		return consumptieLijst;
	}
	
	public List<Extra> getExtras() {
		
		List<Extra> consumptieLijst = new ArrayList<Extra>();
		Connection cxn = Database.getInstance().getConnection();
		
		try{
			Statement statement = cxn.createStatement();
			ResultSet resultaat = statement.executeQuery("SELECT Artikel.ArtikelID, Artikel.Omschrijving, Artikel.Eenheid, Artikel.Prijs, Extra.Voorraad, Soort.Soort FROM (Extra INNER JOIN Artikel ON Artikel.ArtikelID = Extra.ArtikelID) INNER JOIN Soort ON Soort.SoortID = Extra.SoortID");
				
			while (resultaat.next()){
				int artikelId = resultaat.getInt("ArtikelID");
				String omschrijving = resultaat.getString("Omschrijving");
				String eenheid = resultaat.getString("Eenheid");
				double prijs = resultaat.getInt("Prijs");
				int voorraad = resultaat.getInt("Voorraad");
				String soort = resultaat.getString("Soort");
										
				Extra extra = new Extra(artikelId, omschrijving, eenheid, prijs, soort, voorraad);
				consumptieLijst.add(extra);
			}
			statement.close();
					
		}
		catch(Exception e){
	
		}
		return consumptieLijst;
	}

	public Resource getResource(int id) throws Exception{
		Connection cxn = Database.getInstance().getConnection();
		
		try{
			Statement statement = cxn.createStatement();
			ResultSet resultaat = statement.executeQuery("SELECT Resource.ArtikelID, Artikel.Omschrijving, Resource.Status FROM Resource INNER JOIN Artikel ON Resource.ArtikelID = Artikel.ArtikelID WHERE Resource.ArtikelID = " + id);
			
			if(resultaat.next()){
				int artikelId = resultaat.getInt("ArtikelID");
				String omschrijving = resultaat.getString("Omschrijving");
				int status = resultaat.getInt("Status");
				return new Resource(artikelId, omschrijving, "", status);
			}
			else{
				throw new Exception();
			}
		}
		catch(Exception e){
			throw e;
		}
	}
	
	public void setResource(int rekeningId, Resource resource){
		Connection cxn = Database.getInstance().getConnection();
		
		try{
			String sql = String.format("UPDATE Resource SET Status = "+rekeningId+" WHERE ArtikelID = "+resource.getId());
			PreparedStatement statement = cxn.prepareStatement(sql);
			statement.executeUpdate();
		}
		catch(Exception exception){
		}
	}

	public void updateVoorraadExtra(int id) {
		this.updateVoorraadExtra(id, -1);
	}
	
	public void updateVoorraadExtra(int id, int aantal) {
		Connection cxn = Database.getInstance().getConnection();
		
		try{
			String sql = String.format("UPDATE Extra SET Voorraad = (Voorraad + "+aantal+")  WHERE ArtikelID =" + id);
			PreparedStatement statement = cxn.prepareStatement(sql);
			statement.executeUpdate();
		}
		catch(Exception exception){
		}
	}
	
	public boolean zijnResourcesVrij(){
		int aantal = 0;
		Connection cxn = Database.getInstance().getConnection();
		try{
			Statement statement = cxn.createStatement();
			ResultSet resultaat = statement.executeQuery("SELECT Count(ArtikelID) AS aantal FROM Resource WHERE Status>0");
			
			if(resultaat.next()){
				aantal = resultaat.getInt("aantal");
			}
			if(aantal == 0){
				return true;
			} else {
				return false;
			}

		} catch(Exception e){
			return false;
		}
	}
}
